#include <iostream>
#include <memory>
// 1

// 智能指针的实现：1.RAII机制 2.指针的运算符重载:使它可以像正常指针一样使用
class Test
{
public:
    Test()
    {
        std::cout << "构造函数\n";
    }
    ~Test()
    {
        std::cout << "析构函数\n";
    }
    void show()
    {
        std::cout << "herlloword" << std::endl;
    }
};

template <typename T>
class SmartPoint
{
public:
    SmartPoint(T *p) : p(p) {};
    ~SmartPoint()
    {
        delete p;
    }

private:
    T *p;
};

// 不想管理它的内存，可以直接使用独占指针 这样就不用在手动释放了
// using InPtr = std::unique_ptr<int>;
// class T
// {
// public:
//     T() : a(std::make_unique<int>(10))
//     {
//     }

// private:
//     //    std::unique_ptr<int> a;
//     InPtr a;
// };

int main()
{
    // std::unique_ptr<Test> t(new Test);
    std::unique_ptr<Test> t = std::make_unique<Test>(); // 推荐用法 用这个去构建新对象
    t->show();
    // SmartPoint<Test> p(new Test);
    // Test *p = t.get();  // 获取裸指针

    // delete p; // 不允许的
    // 不要去拿裸指针
    // 智能指针和裸指针不能混用

    return 0;
}
